package end.util.jedis;

import java.util.BitSet;
import java.util.List;

import redis.clients.jedis.Jedis;

/**
 * 
 * UserJedisUtil.java 2016-7-11
 * 
 * Copyright zhaocj Inc. All rights reserved. Love Me Like Love Justin Bieber
 * 位图法工具用来记录那段时间登录过的用户的的个数
 */

public class JedisUtil {

	/**
	 * 每日用户登陆记录
	 * */
	public static void activeUsers(String action, long user_id) {
		Jedis redis = JedisPoolUtils.getJedis();
		redis.select(2);

		try {
			redis.setbit(action, user_id, true);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JedisPoolUtils.close(redis);
		}
	}

	public static Long lpushUsers(String last_reg, long user_id) {
		Long lpush = null;
		Jedis redis = JedisPoolUtils.getJedis();
		redis.select(2);
		try {
			lpush = redis.lpush(last_reg, Long.toString(user_id));
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JedisPoolUtils.close(redis);
		}
		return lpush;
	}

	/**
	 * 用来统计那些日期的最新注册用户 用来统计最后注册的注册用户 范围的是string泛型的集合
	 * 
	 */
	public static List<String> lastRegUsers(String last_reg, Long start,
			Long num) {
		Jedis redis = JedisPoolUtils.getJedis();
		redis.select(2);
		List<String> lrange = null;
		try {
			lrange = redis.lrange(last_reg, start, start + num - 1);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JedisPoolUtils.close(redis);
		}
		return lrange;
	}

	/**
	 * 用来统计在某天的活跃用户数 key 的设计原则是每天一个key 格式为 daily_active_users:当日日期
	 * */
	public static int uniqueCount(String action, String date) {
		Jedis redis = JedisPoolUtils.getJedis();
		redis.select(2);
		String key = action + ":" + date;

		BitSet users = null;
		try {
			users = BitSet.valueOf(redis.get(key.getBytes()));
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JedisPoolUtils.close(redis);
		}
		return users.cardinality();
	}

	/**
	 * 用来统计在一个指定多个日期的活跃用户数。计算方式:做Union操作 相当月多个日期的登陆用户的并集,在这个日期范围内登陆过的只计算一次。 key
	 * 的设计原则是每天一个key 格式为 daily_active_users:当日日期
	 * */
	public static int uniqueCount(String action, String... dates) {
		Jedis redis = JedisPoolUtils.getJedis();
		redis.select(2);
		BitSet all = new BitSet();
		try {
			for (String date : dates) {
				String key = action + ":" + date;
				System.out.println(key);
				BitSet users = BitSet.valueOf(redis.get(key.getBytes()));
				all.or(users);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JedisPoolUtils.close(redis);
		}
		return all.cardinality();
	}
}